import axios from 'axios'
import Qs from 'qs'
import { Loading, Message } from 'element-ui';
import store from '@/store'
import router from '@/router'
//axios 实例
const $axios = axios.create({
    baseURL: 'http://www.lovegf.cn:8888/api/private/v1/',
    timeout: 30000,
})

// 定义个 loading 变量
let loading = null

// 请求拦截器
$axios.interceptors.request.use(
    config => {
        loading = Loading.service({ text: '拼命加载中' })
        // const token = store.getters.token
        if (store.state.token) {
            config.headers.Authorization = store.state.token // 请求头部添加token
        }
        return config
    },
    error => {
        return Promise.reject(error)
    }
)
// 响应拦截器
$axios.interceptors.response.use(
    response => {
        if (loading) {
            loading.close()
        }
        const code = response.status
        if ((code >= 200 && code < 300) || code === 304) {
            //判断token 数据是否过期 拦截响应数据
            if (response.data.meta.status == 400) {
                // 1.清空本地用户信息
                store.commit('removeToken')
                store.commit('removeUsername')
                router.options.routes[1].children.splice(1);
                router.$addRoutes(router.options.routes);
                // 2.跳转登陆页面
                router.replace('/login')
                // 3. 提示错误信息
                Message.error(response.data.meta.msg)
                return Promise.reject(response) // 返回失败信息
            }
            return Promise.resolve(response.data)
        } else {
            return Promise.reject(response)
        }
    },
    error => {
        if (loading) {
            loading.close()
        }
        if (error.response) {
            switch (error.response.status) {
                case 401:
                    // 返回401 清除token信息并跳转到登陆页面
                    store.commit('DEL_TOKEN')
                    router.replace('/login')
                    break
                case 404:
                    Message.error('网络请求不存在')
                    break
                default:
                    Message.error(error.response.data.message)
            }
        } else {
            // 请求超时或者网络有问题
            if (error.message.includes('timeout')) {
                Message.error('请求超时！请检查网络是否正常')
            } else {
                Message.error('请求失败，请检查网络是否已连接')
            }
        }
        return Promise.reject(error)
    }
)

function post(url, data) {
    return $axios({
        method: 'post',
        url,
        data: Qs.stringify(data),
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
        }
    })
}

function get(url, params) {
    return $axios({
        method: 'get',
        url,
        params
    })
}
function put(url, params) {
    return $axios({
        method: 'put',
        url,
        data: params
    })
}
function del(url, params) {
    return $axios({
        method: 'delete',
        url,
        params
    })
}

export default {
    post,
    get,
    put,
    del
}